home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / exec1.arc / EXEC2.DSM < prev   
Encoding:
Text File  |  1985-08-30  |  13.9 KB  |  281 lines

  1. locate it
  2. 3FA7:032B 2E            CS:
  3. 3FA7:032C A36505        MOV     [psp_seg],AX    ; save it
  4. 3FA7:032F 051000        ADD     AX,0010        ; skip psp space
  5. 3FA7:0332 2E            CS:
  6. 3FA7:0333 A38405        MOV     [str_seg],AX    ; save it as load address
  7. 3FA7:0336 83EB10        SUB     BX,+10        ; subtract 10 from mem avail
  8. 3FA7:0339 2E            CS:
  9. 3FA7:033A 8B0E8705      MOV     CX,[ovrwrt]
  10. 3FA7:033E 3BC1          CMP     AX,CX        ; we writing over ourself ?
  11. 3FA7:0340 7708          JA      034A        ; yes
  12. 3FA7:0342 2BC8          SUB     CX,AX        ; not yet
  13. 3FA7:0344 3BCB          CMP     CX,BX        ; how bout (load size check)
  14. 3FA7:0346 7702          JA      034A        ; yes
  15. 3FA7:0348 8BD9          MOV     BX,CX        ; are we loading in less than
  16. 3FA7:034A 81FB0010      CMP     BX,1000        ; 64k ?
  17. 3FA7:034E 7308          JNB     0358        ; yes
  18. 3FA7:0350 8BC3          MOV     AX,BX
  19. 3FA7:0352 B104          MOV     CL,04                              
  20. 3FA7:0354 D3E0          SHL     AX,CL        ; convert to bytes                              
  21. 3FA7:0356 EB03          JMP     035B
  22. 3FA7:0358 B8FFFF        MOV     AX,FFFF        ; else read in max bytes
  23. 3FA7:035B 50            PUSH    AX
  24. 3FA7:035C 2E            CS:
  25. 3FA7:035D 8B1E5305      MOV     BX,[channel]
  26. 3FA7:0361 33C9          XOR     CX,CX        ; read in 64k
  27. 3FA7:0363 8BD1          MOV     DX,CX
  28. 3FA7:0365 B80042        MOV     AX,4200        ; this is a .COM program, so
  29. 3FA7:0368 CD21          INT     21        ; pt to start of file
  30. 3FA7:036A 2E            CS:
  31. 3FA7:036B 8B1E5305      MOV     BX,[channel]
  32. 3FA7:036F 59            POP     CX        ; get size
  33. 3FA7:0370 2E            CS:
  34. 3FA7:0371 8E1E8405      MOV     DS,[str_seg]
  35. 3FA7:0375 33D2          XOR     DX,DX        ; pt to load segment
  36. 3FA7:0377 51            PUSH    CX
  37. 3FA7:0378 E86601        CALL    04E1
  38. 3FA7:037B B43F          MOV     AH,3F
  39. 3FA7:037D CD21          INT     21        ; read in program
  40. 3FA7:037F E86801        CALL    04EA
  41. 3FA7:0382 5E            POP     SI        ; get size again
  42. 3FA7:0383 3BC6          CMP     AX,SI        ; get as many as requested
  43. 3FA7:0385 7503          JNZ     038A
  44. 3FA7:0387 E9E0FD        JMP     016A        ; not enough mem ?
  45. 3FA7:038A 2E            CS:
  46. 3FA7:038B F606520502    TEST    BYTE PTR [exe_fnc],02
  47. 3FA7:0390 7522          JNZ     03B4        ; ignore this if overlay
  48. 3FA7:0392 2E            CS:
  49. 3FA7:0393 A18405        MOV     AX,[str_seg]    ; take load address
  50. 3FA7:0396 2D1000        SUB     AX,0010
  51. 3FA7:0399 2E            CS:
  52. 3FA7:039A A35B05        MOV     [strt_seg],AX    ; and point to its PSP
  53. 3FA7:039D 2E            CS:            ; set .COM IP
  54. 3FA7:039E C70659050001  MOV     WORD PTR [strt_off],0100
  55. 3FA7:03A4 4E            DEC     SI        ; put the stack at the end
  56. 3FA7:03A5 2E            CS:            ; probably FFFFh
  57. 3FA7:03A6 89365D05      MOV     [nstk_sp],SI    ; and save it for later
  58. 3FA7:03AA 2E            CS:
  59. 3FA7:03AB A35F05        MOV     [new_stk],AX    ; stack is offset from PSP
  60. 3FA7:03AE 8ED8          MOV     DS,AX        ; push a return to PSP:0
  61. 3FA7:03B0 C7040000      MOV     WORD PTR [SI],0000    ; on the stack
  62. 3FA7:03B4 2E            CS:
  63. 3FA7:03B5 8B1E5305      MOV     BX,[channel]
  64. 3FA7:03B9 E82501        CALL    04E1
  65. 3FA7:03BC B43E          MOV     AH,3E
  66. 3FA7:03BE CD21          INT     21        ; close the file !
  67. 3FA7:03C0 E82701        CALL    04EA
  68. 3FA7:03C3 2E            CS:
  69. 3FA7:03C4 F606520502    TEST    BYTE PTR [exe_fnc],02
  70. 3FA7:03C9 7403          JZ      03CE        ; continue if program
  71. 3FA7:03CB E95901        JMP     0527        ; exit if overlay ( done! )
  72. 3FA7:03CE 2E            CS:
  73. 3FA7:03CF 8B166505      MOV     DX,[psp_seg]    ; pt to the PSP
  74. 3FA7:03D3 BE0100        MOV     SI,0001        ; pt to ?
  75. 3FA7:03D6 2E            CS:
  76. 3FA7:03D7 A16105        MOV     AX,[new_env]
  77. 3FA7:03DA 0BC0          OR      AX,AX
  78. 3FA7:03DC 7405          JZ      03E3        ; prog has no environment
  79. 3FA7:03DE 48            DEC     AX        ; pt to memory control
  80. 3FA7:03DF 8ED8          MOV     DS,AX        ; block of the environment
  81. 3FA7:03E1 8914          MOV     [SI],DX        ; to indicate in use and
  82. 3FA7:03E3 2E            CS:            ; belongs to new program
  83. 3FA7:03E4 A16505        MOV     AX,[psp_seg]    ; pt to program's memory
  84. 3FA7:03E7 48            DEC     AX        ; control block and show
  85. 3FA7:03E8 8ED8          MOV     DS,AX        ; the program owns its
  86. 3FA7:03EA 8914          MOV     [SI],DX        ; memory
  87. 3FA7:03EC 52            PUSH    DX        ; 55 IS UNDOCUMENTED !!!
  88. 3FA7:03ED B455          MOV     AH,55        ; SET UP PSP AT DX
  89. 3FA7:03EF CD21          INT     21        ; which changes DX to pt
  90. 3FA7:03F1 8EC2          MOV     ES,DX        ; to something of the command
  91. 3FA7:03F3 2E            CS:            ; shells.
  92. 3FA7:03F4 89168905      MOV     [cll_psp],DX    ; save ptr
  93. 3FA7:03F8 5A            POP     DX        ; restore DX
  94. 3FA7:03F9 2E            CS:
  95. 3FA7:03FA FF366105      PUSH    [new_env]    ; push the new env ptr
  96. 3FA7:03FE 26            ES:
  97. 3FA7:03FF 8F062C00      POP     [002C]        ; pop it into new PSP
  98. 3FA7:0403 2E            CS:
  99. 3FA7:0404 8B366305      MOV     SI,[new_siz]
  100. 3FA7:0408 03F2          ADD     SI,DX
  101. 3FA7:040A 26            ES:
  102. 3FA7:040B 89360200      MOV     [0002],SI    ; pt to the top of memory
  103. 3FA7:040F 2E            CS:
  104. 3FA7:0410 C5364E05      LDS     SI,[prm_off]    ; pt to the parm block
  105. 3FA7:0414 1E            PUSH    DS
  106. 3FA7:0415 56            PUSH    SI
  107. 3FA7:0416 C57406        LDS     SI,[SI+06]    ; pt to first FCB
  108. 3FA7:0419 B90C00        MOV     CX,000C        ; to be copied into the PSP
  109. 3FA7:041C 51            PUSH    CX
  110. 3FA7:041D BF5C00        MOV     DI,005C
  111. 3FA7:0420 8A1C          MOV     BL,[SI]        ; get first character
  112. 3FA7:0422 F3            REPZ
  113. 3FA7:0423 A4            MOVSB            ; move it
  114. 3FA7:0424 33C0          XOR     AX,AX
  115. 3FA7:0426 AB            STOSW
  116. 3FA7:0427 AB            STOSW            ; make it unopened
  117. 3FA7:0428 59            POP     CX
  118. 3FA7:0429 5E            POP     SI
  119. 3FA7:042A 1F            POP     DS
  120. 3FA7:042B 1E            PUSH    DS
  121. 3FA7:042C 56            PUSH    SI
  122. 3FA7:042D C5740A        LDS     SI,[SI+0A]    ; pt to second FCB
  123. 3FA7:0430 BF6C00        MOV     DI,006C        ; to be copied into the PSP
  124. 3FA7:0433 8A3C          MOV     BH,[SI]        ; get first char again
  125. 3FA7:0435 F3            REPZ
  126. 3FA7:0436 A4            MOVSB            ; move it
  127. 3FA7:0437 AB            STOSW
  128. 3FA7:0438 AB            STOSW            ; make it unopened
  129. 3FA7:0439 5E            POP     SI
  130. 3FA7:043A 1F            POP     DS
  131. 3FA7:043B C57402        LDS     SI,[SI+02]    ; pt to the command line
  132. 3FA7:043E B98000        MOV     CX,0080        ; MAX of 128 chars copied
  133. 3FA7:0441 8BF9          MOV     DI,CX        ; into the DTA at PSP + 80h
  134. 3FA7:0443 F3            REPZ
  135. 3FA7:0444 A4            MOVSB            ; copy it
  136. 3FA7:0445 FEC9          DEC     CL        ; CL = FFh
  137. 3FA7:0447 2E            CS:
  138. 3FA7:0448 3A3E8B05      CMP     BH,[cur_dsk]
  139. 3FA7:044C 7604          JBE     0452        ; 2nd FCB is on same drive
  140. 3FA7:044E 8AF9          MOV     BH,CL        ; mark invalid FCB
  141. 3FA7:0450 EB02          JMP     0454        ; at PSP + 6Ch
  142. 3FA7:0452 32FF          XOR     BH,BH        ; mark valid FCB
  143. 3FA7:0454 2E            CS:
  144. 3FA7:0455 3A1E8B05      CMP     BL,[cur_dsk]    ; same for FCB at PSP + 5Ch
  145. 3FA7:0459 7604          JBE     045F
  146. 3FA7:045B 8AD9          MOV     BL,CL        ; mark FCB invalid
  147. 3FA7:045D EB02          JMP     0461
  148. 3FA7:045F 32DB          XOR     BL,BL        ; mark FCB valid
  149. 3FA7:0461 E8D400        CALL    0538        ; set DS to pt to stk args
  150. 3FA7:0464 FF7414        PUSH    [SI+14]        ; Take the return address of
  151. 3FA7:0467 FF7412        PUSH    [SI+12]        ; the interrupt to be the
  152. 3FA7:046A FF7414        PUSH    [SI+14]        ; terminate address & the
  153. 3FA7:046D FF7412        PUSH    [SI+12]        ; CTRL-C return address ...
  154. 3FA7:0470 26            ES:
  155. 3FA7:0471 8F060A00      POP     [000A]        ; set the terminate address
  156. 3FA7:0475 26            ES:
  157. 3FA7:0476 8F060C00      POP     [000C]        ; up at PSP + 0Ah
  158. 3FA7:047A 33C0          XOR     AX,AX
  159. 3FA7:047C 8ED8          MOV     DS,AX
  160. 3FA7:047E 8F068800      POP     [0088]
  161. 3FA7:0482 8F068A00      POP     [008A]        ; put it in int 22H, too
  162. 3FA7:0486 52            PUSH    DX
  163. 3FA7:0487 1E            PUSH    DS
  164. 3FA7:0488 2E            CS:
  165. 3FA7:0489 8E1E8905      MOV     DS,[cll_psp]
  166. 3FA7:048D BA8000        MOV     DX,0080
  167. 3FA7:0490 B41A          MOV     AH,1A
  168. 3FA7:0492 CD21          INT     21        ; set the DTA to PSP + 80h
  169. 3FA7:0494 1F            POP     DS
  170. 3FA7:0495 5A            POP     DX
  171. 3FA7:0496 2E            CS:
  172. 3FA7:0497 F606520501    TEST    BYTE PTR [exe_fnc],01
  173. 3FA7:049C 7426          JZ      04C4        ; avoid if a program
  174. 3FA7:049E 2E            CS:
  175. 3FA7:049F C5365D05      LDS     SI,[nstk_sp]    ; pt to the new stack
  176. 3FA7:04A3 2E            CS:
  177. 3FA7:04A4 C43E4E05      LES     DI,[prm_off]
  178. 3FA7:04A8 26            ES:
  179. 3FA7:04A9 8C5D10        MOV     [DI+10],DS    ; return stack segment in
  180. 3FA7:04AC 4E            DEC     SI        ; parm block
  181. 3FA7:04AD 4E            DEC     SI
  182. 3FA7:04AE 891C          MOV     [SI],BX        ; push    fcb status on it
  183. 3FA7:04B0 26            ES:
  184. 3FA7:04B1 89750E        MOV     [DI+0E],SI    ; save new stack pointer
  185. 3FA7:04B4 2E            CS:
  186. 3FA7:04B5 C5065905      LDS     AX,[strt_off]    ; and then save new starting
  187. 3FA7:04B9 26            ES:
  188. 3FA7:04BA 8C5D14        MOV     [DI+14],DS    ; segment and offset for the
  189. 3FA7:04BD 26            ES:
  190. 3FA7:04BE 894512        MOV     [DI+12],AX    ; debugger, this is the
  191. 3FA7:04C1 EB64          JMP     0527        ; UNDOCUMENTED function
  192. 3FA7:04C3 90            NOP            ; call 01 used to load and
  193. 3FA7:04C4 E87800        CALL    053F        ; not execute a program !!!
  194. 3FA7:04C7 2E            CS:
  195. 3FA7:04C8 C5365905      LDS     SI,[strt_off]
  196. 3FA7:04CC FA            CLI            ; stop interrupts
  197. 3FA7:04CD 2E            CS:
  198. 3FA7:04CE 8E165F05      MOV     SS,[new_stk]    ; while we set up the
  199. 3FA7:04D2 2E            CS:
  200. 3FA7:04D3 8B265D05      MOV     SP,[nstk_sp]    ; new stack
  201. 3FA7:04D7 FB            STI            ; start interrupts
  202. 3FA7:04D8 1E            PUSH    DS        ; push start seg
  203. 3FA7:04D9 56            PUSH    SI        ; push start offset
  204. 3FA7:04DA 8EC2          MOV     ES,DX        ; pt to psp
  205. 3FA7:04DC 8EDA          MOV     DS,DX        ; pt to psp
  206. 3FA7:04DE 8BC3          MOV     AX,BX        ; set PSP FCB flag
  207. 3FA7:04E0 CB            RETF            ; start new process !!!
  208. ;--------------------------------------------------------------------------
  209. ; a proc called several times in case theres an error during a DOS function
  210. ; call and control isn't returned to this program, this effectively frees
  211. ; up the memory allocated for an environment and I think the program to.
  212. 3FA7:04E1 53            PUSH    BX
  213. 3FA7:04E2 BB0000        MOV     BX,0000        ; indicate an available area
  214. 3FA7:04E5 E80D00        CALL    04F5        ; set the mem ctrl blks
  215. 3FA7:04E8 5B            POP     BX
  216. 3FA7:04E9 C3            RET
  217. ;--------------------------------------------------------------------------
  218. ; a proc which is called after a DOS function call which pts the environment
  219. ; back at the new process.
  220. 3FA7:04EA 53            PUSH    BX
  221. 3FA7:04EB 2E            CS:
  222. 3FA7:04EC 8B1E8905      MOV     BX,[cll_psp]    ; indicate area belongs
  223. 3FA7:04F0 E80200        CALL    04F5        ; to the new program
  224. 3FA7:04F3 5B            POP     BX
  225. 3FA7:04F4 C3            RET
  226. ;--------------------------------------------------------------------------
  227. ; this is the proc which does the actual setting of the memory control blocks
  228. ; on both the new program and the new environment
  229. 3FA7:04F5 1E            PUSH    DS
  230. 3FA7:04F6 50            PUSH    AX        ; save registers
  231. 3FA7:04F7 2E            CS:
  232. 3FA7:04F8 A16105        MOV     AX,[new_env]
  233. 3FA7:04FB 0BC0          OR      AX,AX
  234. 3FA7:04FD 7407          JZ      0506        ; there is no env
  235. 3FA7:04FF 48            DEC     AX        ; pt to env's mem ctl blk
  236. 3FA7:0500 8ED8          MOV     DS,AX
  237. 3FA7:0502 891E0100      MOV     [0001],BX    ; set to passed in value
  238. 3FA7:0506 2E            CS:
  239. 3FA7:0507 A16505        MOV     AX,[psp_seg]    ; get new psp_seg
  240. 3FA7:050A 0BC0          OR      AX,AX
  241. 3FA7:050C 7407          JZ      0515        ; we don't have one yet
  242. 3FA7:050E 48            DEC     AX
  243. 3FA7:050F 8ED8          MOV     DS,AX        ; pt to PSP's mem ctl blk
  244. 3FA7:0511 891E0100      MOV     [0001],BX    ; set to passed in value
  245. 3FA7:0515 58            POP     AX
  246. 3FA7:0516 1F            POP     DS        ; restore registers
  247. 3FA7:0517 C3            RET
  248. ;--------------------------------------------------------------------------
  249. 3FA7:0518 E81D00        CALL    0538        ; set to origional stack
  250. 3FA7:051B FF7416        PUSH    [SI+16]        ; get something passed in
  251. 3FA7:051E 32E4          XOR     AH,AH        ; 
  252. 3FA7:0520 8904          MOV     [SI],AX        ; zero top of the stack ?
  253. 3FA7:0522 9D            POPF
  254. 3FA7:0523 F9            STC            ; signal function error
  255. 3FA7:0524 EB09          JMP     052F        ; on our way out
  256. 3FA7:0526 90            NOP
  257. 3FA7:0527 E80E00        CALL    0538        ; get origional stack
  258. 3FA7:052A FF7416        PUSH    [SI+16]        ; get flags
  259. 3FA7:052D 9D            POPF            ; for overlays ???
  260. 3FA7:052E F8            CLC            ; everything went okay
  261. 3FA7:052F 9C            PUSHF
  262. 3FA7:0530 E80C00        CALL    053F        ; reset ctrl - c
  263. 3FA7:0533 8F4416        POP     [SI+16]        ; reset flags
  264. 3FA7:0536 EBA8          JMP     04E0        ; return
  265. ;--------------------------------------------------------------------------
  266. ; this proc pts the ds to the origional stack which called this from below
  267. 3FA7:0538 16            PUSH    SS
  268. 3FA7:0539 1F            POP     DS
  269. 3FA7:053A C536B30B      LDS     SI,[0BB3]    ; pt to stack args with ds
  270. 3FA7:053E C3            RET
  271. ;--------------------------------------------------------------------------
  272. ; this proc resets the Control - C flag to what it was before execution
  273. 3FA7:053F 50            PUSH    AX
  274. 3FA7:0540 52            PUSH    DX        ; save regs
  275. 3FA7:0541 2E            CS:
  276. 3FA7:0542 8A168605      MOV     DL,[Ctl_CFLG]    ; get old status
  277. 3FA7:0546 B80133        MOV     AX,3301
  278. 3FA7:0549 CD21          INT     21        ; set it to what it was
  279. 3FA7:054B 5A            POP     DX
  280. 3FA7:054C 58            POP     AX        ; restore regs
  281. 3FA7:054D C3            RET